package com.glink.manage.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.UserBean;
import com.glink.manage.dto.user.*;
import com.glink.manage.vo.user.*;

import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : qiushaoshan
 * @create 2024/6/18 10:27
 */
public interface UserService extends IService<UserBean> {
    /**
     * 新增用户
     * @param userSaveDTO 保存入参
     * @return 返回状态
     */
    boolean insertUser(UserSaveDTO userSaveDTO) throws GeneralSimpleException;

    boolean insertUser(UserSaveDTO userSaveDTO, String userId) throws GeneralSimpleException;
    /**
     * 修改用户
     * @param userUpdateDTO 保存入参
     * @return 返回状态
     */
    boolean updateUser(UserUpdateDTO userUpdateDTO) throws GeneralSimpleException;

    /**
     * 根据用户账号获取用户信息
     *
     * @param userName 用户账号
     * @return 用户信息
     */
    UserVO findByUserName(String userName);

    /**
     * 变更用户状态
     * @param statusDTO 用户信息
     * @return 更新状态
     */
    boolean updateStatus(UserStatusDTO statusDTO) throws GeneralSimpleException;

    /**
     * 分页查询用户信息
     *
     * @param pageDTO 查询条件
     * @return 用户信息
     */
    IPage<UserPageVO> findUserPage(UserPageDTO pageDTO) throws GeneralSimpleException;

    /**
     * 关联第三方账号
     * @param relaAccountDTO 关联第三方账号信息
     * @return 关联状态
     */
    Boolean relaThirdParty(UserRelaAccountDTO relaAccountDTO) throws GeneralSimpleException;

    /**
     * 根据ID获取用户信息
     * @param id 用户id
     * @return 用户信息
     */
    UserBaseInfoVO findById(String id);

    /**
     * 根据用户ID删除用户信息
     * @param userIdDTO 用户ID信息
     * @return 删除状态
     */
    Boolean deleteUser(UserIdDTO userIdDTO) throws GeneralSimpleException;

    /**
     * 获取用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    UserSimpleInfoVO currentUser(String userId) throws GeneralSimpleException;

    /**
     * 根据组织ID解除用户
     * @param orgId 组织ID
     * @return 解除状态
     */
    boolean disOrgByOrgId(String orgId);

    /**
     * 根据用户ID查询用户名称
     * @param userIdList 用户ID
     * @return 用户名称
     */
    Map<String, String> findNameByIdIn(List<String> userIdList);

    /**
     * 根据用户名称查询用户信息
     * @param fullName 用户名称 
     * @return 用户信息
     */
    List<String> findUserIdByFullName(String fullName);

    /**
     * 查询用户的角色信息
     * @param userId 用户ID
     * @return 角色信息
     */
    List<String> findRoleListByUserId(String userId);

    /**
     * 根据用户信息查询
     * @param userId 用户ID
     * @return 用户权限
     */
    UserPermissionInfoVO findPermissionByUserId(String userId) throws GeneralSimpleException;

    /**
     * 根据用户ID查询用户状态
     * @param accountObjId 用户ID
     * @return 用户状态
     */
    String findStatusByUserId(String accountObjId);

    /**
     * 更新用户账号信息
     *
     * @param name         用户名
     * @param orgId        所属单位
     * @param accountObjId 用户ID
     * @return
     */
    boolean updateNameAndOrdIdByAccountId(String name, String orgId, String accountObjId);

    /**
     * 查询所有的总部管理员用户
     * @return 管理员用户ID
     */
    List<String> findAllHeadOfficeUserId();

    /**
     * 根据所属项目部ID查询项目部管理员ID
     * @param projectDepartmentObjId 项目部ID
     * @return 用户ID
     */
    List<String> findProjectDepartmentAdminUserIdByProjectDepartmentId(String projectDepartmentObjId);
    List<String> findProjectDepartmentAdminUserIdByProjectDepartmentIdIn(List<String> orgIdList);

    /**
     * 校验用户是否是系统管理员
     *
     * @return 是否是系统管理员
     */
    boolean checkAdminByUser() throws GeneralSimpleException;
    boolean checkAdminByUser(String userId) throws GeneralSimpleException;

    /**
     * 校验用户是否是总部管理员
     *
     * @return 是否是系统管理员
     */
    boolean checkHeadOffice() throws GeneralSimpleException;
    
    boolean checkHeadOffice(String userId) throws GeneralSimpleException;

    /**
     * 校验用户是否是项目部管理员
     * @return 是否是项目部管理员
     * @throws GeneralSimpleException
     */
    boolean checkProjectDepartment() throws GeneralSimpleException;
    boolean checkProjectDepartment(String userId) throws GeneralSimpleException;


    /**
     * 校验用户是否是参建单位管理员
     *
     * @return 是否是参建单位管理员
     */
    boolean checkCJDWByUser() throws GeneralSimpleException;

    /**
     * 校验用户是否是参建单位管理员
     *
     * @return 是否是参建单位管理员
     */
    boolean checkCJDWByUser(String userId) throws GeneralSimpleException;
    
    /**
     * 校验用户是否是总包单位管理员
     *
     * @return 是否是总包单位管理员
     */
    boolean checkGeneralContractingUnit() throws GeneralSimpleException;
    
    /**
     * 校验用户是否是总包单位管理员
     *
     * @return 是否是总包单位管理员
     */
    boolean checkGeneralContractingUnit(String userId) throws GeneralSimpleException;
    
    /**
     * 查询系统所有系统管理员ID
     * @return 系统管理员用户ID
     */
    List<String> findAllSystemAdminUserId();

    /**
     * 根据用户信息查询用户单位
     * @param userIdList 用户ID
     * @return 用户ID和单位
     */
    Map<String, String> findUserAndOrgByUserIdIn(List<String> userIdList);

    /**
     * 账号禁用
     * @param accountObjId 账号
     */
    void disable(String accountObjId);
    void disable(List<String> accountObjIdList);

    /**
     * 根据用户ID查询用户账号信息
     * @param accountObjId 用户账号
     * @return 用户账号信息
     */
    UserBaseInfoVO findInfoByUserId(String accountObjId);

    /**
     * 更新用户账号信息
     *
     * @param name         姓名
     * @param orgId        单位
     * @param status       状态
     * @param accountObjId 账号
     * @return 更新状态
     */
    boolean updateUserInfoById(String name, String orgId, String status, String accountObjId);

    /**
     * 更新账号其用状态
     * @param newStatus 新的状态
     * @param accountObjId 用户账号ID
     * @param oldStatus 旧的状态
     * @return 更新标识
     */
    Boolean updateStatusByIdAndStatus(String newStatus, String accountObjId, String oldStatus);
}
